package com.roc.admin.infrastructure.common.interceptor;

import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.stp.StpUtil;
import com.roc.admin.domain.entity.User;
import com.roc.admin.domain.repository.UserRepository;
import com.roc.admin.domain.valueobject.UserPermission;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;

import java.util.Set;

/**
 * 数据权限拦截器
 * 用于实现RBAC中的数据权限控制
 */
@Slf4j
//@Component
@AllArgsConstructor
public class DataPermissionInterceptor implements HandlerInterceptor {

    private final UserRepository userRepository;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        try {
            // 从Sa-Token中获取当前登录用户ID
            Long userId = StpUtil.getLoginIdAsLong();
            if (userId == null) {
                return true;
            }

            // 获取用户信息
            User user = userRepository.findById(userId).orElse(null);
            if (user == null) {
                return true;
            }
            // TODO 获取用户权限 判断是否是管理员，如果是管理员则不进行数据权限控制
//        if (user.isAdmin()) {
//            return true;
//        }


            // 获取用户权限
            Set<UserPermission> permissions = user.getPermissions();

            // 设置数据权限标识到请求属性中，供后续处理使用
            request.setAttribute("DATA_PERMISSION_USER_ID", userId);
            request.setAttribute("DATA_PERMISSION_DEPT_ID", user.getDeptId());
            request.setAttribute("DATA_PERMISSION_PERMISSIONS", permissions);

            return true;
        } catch (SaTokenException e) {
            log.error("数据权限拦截器异常", e.getMessage());
            // todo 待修复
            return true;
        }

    }
}
